package com.rem.shiro.utils;

import cn.hutool.core.date.DateUtil;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import javax.xml.bind.DatatypeConverter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 因为jwt可以适应多平台 所以此处仅仅使用java的 jwt应用
 * JJWT是一个提供端到端的JWT创建和验证的Java库
 * <p>
 * JJWT是纯粹基于JWT，JWS，JWE，JWK和JWA RFC规范的纯Java实现，并且根据Apache 2.0许可的条款是开源的。
 * 该库由Okta的高级建筑师Les Hazlewood创建，并由贡献者社区提供支持和维护。 Okta是面向开发人员的完整身份验证和用户管理API。 我们还添加了一些不属于该规范的便利扩展，例如JWS压缩和声明执行。
 *
 * @author Rem
 * @date 2021-04-15
 */

public class JwtUtils {

    private static final String SALT = "t4bbDwxtMzj9efw+iiKqlZDpUzUBbG9emWyNys0DTdQ=";


    /**
     * 生成token
     *
     * @return
     */
    public static String generateToken(Map<String, Object> map) {
        SecretKey secretKey = Keys.hmacShaKeyFor(DatatypeConverter.parseBase64Binary(SALT));

        JwtBuilder builder = Jwts.builder();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String k = entry.getKey();
            Object v = entry.getValue();
            builder.claim(k, v);
        }

        return builder
                //请求方式
                .setHeaderParam("type", "JWT")
                //秘钥
                .signWith(secretKey, SignatureAlgorithm.HS256)
                //认证名称
                .setIssuer("Rem")
                //起始时间
                .setIssuedAt(new Date())
                //过期时间
                .setExpiration(DateUtil.offsetDay(new Date(), 7))
                //测试subject和id
                .setSubject((String) map.get("sub"))
                .setId((String) map.get("id"))
                .compact();
    }


    /**
     * 校验token 并得到返回值
     *
     * @param token 放入的token
     * @return Claims
     */
    public static Claims getTokenInfo(String token) {
        SecretKey secretKey = Keys.hmacShaKeyFor(DatatypeConverter.parseBase64Binary(SALT));
        JwtParser parser = Jwts.parserBuilder().setSigningKey(secretKey).build();

        Jws<Claims> claimsJws = parser.parseClaimsJws(token);

        return claimsJws.getBody();

    }


    public static void main(String[] args) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("userId", "99");
        map.put("userName", "zhangsan");
        String s = generateToken(map);
        System.out.println(s);
        //  getTokenInfo("eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJ1c2VyTmFtZSI6InpoYW5nc2FuIiwidXNlcklkIjoiOTkiLCJpc3MiOiJSZW0iLCJpYXQiOjE2MTg0NzkwNzgsImV4cCI6MTYxOTA4Mzg3OCwic3ViIjoicXdlIiwianRpIjoiMTIzIn0.5ffN-LXOZwM0BvnpFwwPQYrzGDVrPjqhMm3fXvDC3mI");
    }

}
